/**
 * @file 该脚本用于为数据库填充初始数据。
 * 它被设计为幂等的，这意味着它可以多次运行而不会创建重复的数据。
 * 它使用内存缓存来通过减少数据库查询次数来提高性能。
 */

const { PrismaClient } = require('@prisma/client');
const { generateUsers } = require('./initialData/authData');

// 系统内置角色名称常量
const SystemRoleNames = {
  ADMIN: '系统管理员',
  BOSS: '公司管理者',
  EMPLOYEE: '使用者',
  MANAGER: '部门主管'
}

const prisma = new PrismaClient();

/**
 * 认证相关数据初始化（角色和用户）
 */
async function seedAuthData() {
  console.log('开始初始化认证数据...');
  
  // 创建/更新超管角色
  let adminRole = await prisma.role.findFirst({ where: { name: SystemRoleNames.ADMIN, delete: 0 } });
  if (adminRole) {
    adminRole = await prisma.role.update({
      where: { id: adminRole.id },
      data: {
        description: '拥有所有权限，可以访问所有功能模块',
        allowedRoutes: [],
      },
    });
    console.log('系统管理员角色已存在，已更新');
  } else {
    adminRole = await prisma.role.create({
      data: {
        name: SystemRoleNames.ADMIN,
        description: '拥有所有权限，可以访问所有功能模块',
        allowedRoutes: [],
      },
    });
    console.log('系统管理员角色已创建');
  }

  // 创建/更新公司管理者角色
  let bossRole = await prisma.role.findFirst({ where: { name: SystemRoleNames.BOSS, delete: 0 } });
  if (bossRole) {
    bossRole = await prisma.role.update({
      where: { id: bossRole.id },
      data: {
        description: '公司管理者角色，拥有所有权限，可以访问所有功能模块',
        allowedRoutes: [],
      },
    });
    console.log('公司管理者角色已存在，已更新');
  } else {
    bossRole = await prisma.role.create({
      data: {
        name: SystemRoleNames.BOSS,
        description: '公司管理者角色，拥有所有权限，可以访问所有功能模块',
        allowedRoutes: [],
      },
    });
    console.log('公司管理者角色已创建');
  }

  // 创建/更新使用者角色
  /**
   * 生产上线前屏蔽：演示角色“使用者”不入库
   */
  // let employeeRole = await prisma.role.findFirst({ where: { name: SystemRoleNames.EMPLOYEE, delete: 0 } });
  // if (employeeRole) {
  //   employeeRole = await prisma.role.update({
  //     where: { id: employeeRole.id },
  //     data: {
  //       description: '使用者角色，拥有员工日程管理和通知消息权限',
  //       allowedRoutes: ['/schedule/list', '/schedule/detail', '/notifications'],
  //     },
  //   });
  //   console.log('使用者角色已存在，已更新');
  // } else {
  //   employeeRole = await prisma.role.create({
  //     data: {
  //       name: SystemRoleNames.EMPLOYEE,
  //       description: '使用者角色，拥有员工日程管理和通知消息权限',
  //       allowedRoutes: ['/schedule/list', '/schedule/detail', '/notifications'],
  //     },
  //   });
  //   console.log('使用者角色已创建');
  // }

  // 创建/更新部门主管角色
  /**
   * 生产上线前屏蔽：演示角色“部门主管”不入库
   */
  // let managerRole = await prisma.role.findFirst({ where: { name: SystemRoleNames.MANAGER, delete: 0 } });
  // if (managerRole) {
  //   managerRole = await prisma.role.update({
  //     where: { id: managerRole.id },
  //     data: {
  //       description: '部门主管角色，拥有部门日程管理和通知消息权限',
  //       allowedRoutes: ['/schedule/list', '/schedule/detail', '/notifications'],
  //     },
  //   });
  //   console.log('部门主管角色已存在，已更新');
  // } else {
  //   managerRole = await prisma.role.create({
  //     data: {
  //       name: SystemRoleNames.MANAGER,
  //       description: '部门主管角色，拥有部门日程管理和通知消息权限',
  //       allowedRoutes: ['/schedule/list', '/schedule/detail', '/notifications'],
  //     },
  //   });
  //   console.log('部门主管角色已创建');
  // }


  // 仅生成并处理“系统管理员用户”
  const encryptedUsers = await generateUsers();
  for (const user of encryptedUsers) {
    if (user.code !== '88888888') {
      // 生产上线前屏蔽：非系统管理员用户不写入
      continue;
    }
    const roleId = adminRole.id;
    const roleName = '系统管理员';
    const existingUser = await prisma.user.findFirst({ where: { code: user.code, delete: 0 } });
    if (existingUser) {
      await prisma.user.update({
        where: { id: existingUser.id },
        data: {
          name: user.name,
          department: user.department,
          email: user.email,
          phone: user.phone,
          password: user.password,
          roleId: roleId,
        },
      });
      console.log(`${roleName}用户 "${user.name}" (${user.code}) 已更新`);
    } else {
      await prisma.user.create({
        data: {
          code: user.code,
          name: user.name,
          department: user.department,
          email: user.email,
          phone: user.phone,
          password: user.password,
          roleId: roleId,
        },
      });
      console.log(`${roleName}用户 "${user.name}" (${user.code}) 已创建`);
    }
  }
  console.log('认证数据初始化完成！');
  console.log('\n角色权限说明：');
  console.log('- 系统管理员: 拥有所有权限，可以访问所有功能模块');
  console.log('- 公司管理者: 公司管理者角色，拥有所有权限，可以访问所有功能模块');
  console.log('- 使用者: 拥有员工日程管理和通知消息权限');
  console.log('- 部门主管: 拥有部门日程管理和通知消息权限');
  console.log('\n初始用户账号：');
  console.log('系统管理员: 88888888/88888888');
  // 生产上线前屏蔽：演示账号提示
  // console.log('管理者: b1/b1, b2/b2');
  // console.log('使用者: e1/e1, e2/e2, e3/e3, e4/e4');
  // console.log('部门主管: m1/m1, m2/m2');
}

/**
 * 主函数，是整个填充脚本的入口和调度中心。
 * 它负责初始化所有需要的缓存，并按正确的依赖顺序调用各个填充函数。
 */
async function main() {
  // 认证相关数据初始化
  await seedAuthData();
}

// 脚本的执行入口点。
main()
  .catch((e) => {
    // 捕获并打印任何在异步执行过程中发生的错误。
    console.error(e, '数据生成过程中发生错误:');
    process.exit(1); // 以非零退出码退出，表示执行失败。
  })
  .finally(async () => {
    // 无论成功或失败，最后都确保断开与数据库的连接，释放资源。
    await prisma.$disconnect();
  });

